(function(window) {
    /** Weibo
     * 只能在 weibo 绑定的域名下使用： （如：all.vic.sina.com.cn）
     * [Page轻应用开发文档-微博客户端JSAPI]
     * [http://open.xxx.com/wiki/Page%E8%BD%BB%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3-%E5%BE%AE%E5%8D%9A%E5%AE%A2%E6%88%B7%E7%AB%AFJSAPI]
     * @author kaican
     * @desc 2018/9/13
     *
     * • WeiboJSBridge.init() 用途：使用提供 appkey 和 access_token 进行初始化；目前仅有共享地址簿组件才需要调用 WeiboJSBridge.init() 方法。
     * • WeiboJSBridge.invoke() 用途：调用 Bridge 的 Action 或组件
     * • WeiboJSBridge.on() 用途：监听 Bridge 的事件
     *
     * 可调用的方法：
     * 1. ready() 在ready中去做这些事情
     * 2. init() 初始化
     * ...
     */
    function wb() {
        var that = this;

        // DOMContentLoaded 中去做这件事
        // 有时网页加载速度较慢，可能在 `DOMContentLoaded` 之后很久 bridge 才会注入。
        // 如果对速度要求很高，可以在 `DOMContentLoaded` 时主动告诉 native 来注入 bridge
        document.addEventListener("DOMContentLoaded", function(event) {
            if (typeof window.WeiboJSBridge === 'undefined') {
                var invokeIframe = document.createElement('iframe');
                invokeIframe.id = '__WeiboJSInvokeIframe';  // 注意将 `iframe` 的 `id` 设为 `__WeiboJSInvokeIframe` 可以避免 bridge 注入时重复生成
                invokeIframe.style.display = 'none';
                document.documentElement.appendChild(invokeIframe);

                invokeIframe.src = 'sinaweibo://bridge_initialize';
            }
        });

        /** ready
         * [description]
         * @param  {Function} callback [description]
         * @return {[type]}            [description]
         */
        this.ready = function(callback) {
            // WeiboJSBridgeReady 等待ready
            document.addEventListener('WeiboJSBridgeReady', function () {
            	if(callback) callback();
            });
        };

        /** init
         * [目前仅有共享地址簿组件才需要调用 WeiboJSBridge.init() 方法。]
         * @param  {[type]} appkey       [description]
         * @param  {[type]} access_token [description]
         * @return {[type]}              [description]
         */
        this.init = function(appkey, access_token) {
            // 目前仅有共享地址簿组件才需要调用 WeiboJSBridge.init() 方法。
            // 针对收货地址组件等功能
            WeiboJSBridge.init({
            	'appkey': appkey,
            	'access_token': access_token
            });
        };

        /** openImage
         * [description]
         * @param  {[type]} currentSrc [description]
         * @param  {[type]} allSrcs    [description]
         * @return {[type]}            [description]
         */
        this.openImage = function(currentSrc, allSrcs) {
            var params = {
                'url': currentSrc,
                'urls': allSrcs
            };
            WeiboJSBridge.invoke("openImage", params, function (params, success, code) {
                if(success) {
                    // do something.
                }
                else {
                    if (code == WeiboJSBridge.STATUS_CODE.MISSING_PARAMS) {  // `url` 与 `urls` 至少需要传递一个
                        // do something.
                    }
                }
            });
        };

        /** pickImage
         * [*注：返回的 base64 没有前缀，如："data:image/png;base64,"，因此慎用！]
         * @param  {Function} callback [description]
         * @param  {String} source [`camera` 为拍照，其他为从相册选择]
         * @return {[params.base64]}            [description]
         */
        this.pickImage = function(callback, source) {
            var params = {
                'source': source ? source : ""
            };
            WeiboJSBridge.invoke("pickImage", params, function (params, success, code) {
                if(success) {
                    // do something.
                    if(callback) callback(arguments[0]);
                }
                else {
                    if (code == WeiboJSBridge.STATUS_CODE.USER_CANCELLED) {  // 用户取消了选图
                        // do something.
                    }
                    else if (code == WeiboJSBridge.STATUS_CODE.SERVICE_FORBIDDEN) {  // 设备没有摄像头或用户不允许选图
                        // do something.
                    }
                }
            });
        };

        /** scanQRCode
         * [description]
         * @param  {Function} callback [description]
         * @return {[params.result]}            [description]
         */
        this.scanQRCode = function(callback) {
            var params = {};
            WeiboJSBridge.invoke("scanQRCode", params, function (params, success, code) {
                if(success) {
                    // do something.
                    if(callback) callback(arguments[0]);
                }
                else {
                    if (code == WeiboJSBridge.STATUS_CODE.USER_CANCELLED) {  // 用户取消了选图
                        // do something.
                    }
                    else if (code == WeiboJSBridge.STATUS_CODE.SERVICE_FORBIDDEN) {  // 设备没有摄像头或用户不允许选图
                        // do something.
                    }
                }
            });
        };

        /** setBrowserTitle
         * [description]
         * @param  {[type]} title [description]
         * @return {[type]}       [description]
         */
        this.setBrowserTitle = function(title) {
            var params = {
                'title': title
            };
            WeiboJSBridge.invoke("setBrowserTitle", params, function (params, success, code) {
                if(success) {
                    // do something.
                }
                else {
                    if (code == WeiboJSBridge.STATUS_CODE.MISSING_PARAMS) {  // 未传递 `title` 参数
                        // do something.
                    }
                }
            });
        };

        /** getNetworkType
         * [description]
         * @return {[params.network_type]} [`wwan` 代表 2G 或 3G， `wifi` 代表 WIFI, `fail` 代表无网络]
         */
        this.getNetworkType = function(success, fail) {
            WeiboJSBridge.invoke("getNetworkType", {}, function (params, success, code) {
                if(success) {
                    // do something.
                    if(success) success(params);
                }
                else {
                  if(code == WeiboJSBridge.STATUS_CODE.NO_RESULT) {
                    if(fail) fail(params, code);
                  }
                }
            });
        };

        /** setSharingContent
         * [此处设置的是分享到第三方平台的默认文案]
         * @return {[type]} [description]
         */
        this.setSharingContent = function(icon, title, desc) {
            var params = {
                'external': {
                    'icon': icon,  // 表示图片的 URL
                    'title': title,  // title 表示标题
                    'desc': desc  // desc 表示文案
                }
            };
            WeiboJSBridge.invoke("setSharingContent", params);
        };

        /** saveImage
         * [description]
         * @return null [description]
         */
        this.saveImage = function(url, success, fail) {
          var params = {
              image_url: url,
          };
          WeiboJSBridge.invoke("saveImage", params, {
             success: function(params) {
                 if(success) success(params);
             },
             fail: function(params, code) {
                 // alert("fail_" + JSON.stringify(params) + "_" + code);
                 if(fail) fail(params, code);
             },
             final: function(params) {
                 // alert("final" + JSON.stringify(params));
             },
         });
        };

        /** login
         * [*未实现  唤起登录功能]
         * @return {[type]} [description]
         */
        // this.login = function(redirect_uri) {
        //     var params = {
        //         'redirect_uri' : encodeURIComponent(redirect_uri)
        //     };
        //     WeiboJSBridge.invoke("login", params, function (params, success, code) {});
        // };

        /** getLocation
         * [description]
         * @return {"lat": 100, "long": 100} [description]
         */
        this.getLocation = function(success, fail, final) {
          WeiboJSBridge.invoke("getLocation", {}, {
            success: function(res) {
                if(success) success(res);
            },
            fail: function(params, code) {
                // alert("fail_" + JSON.stringify(params) + "_" + code);
                if(fail) fail(params, code);
            },
            final: function(params) {
                // alert("final" + JSON.stringify(params));
                if(final) final(params);
            },
          });
        };

        /** getBrowserInfo
         * [description]
         * @param  {[type]} success [description]
         * @param  {[type]} fail    [description]
         * @return {[type]}         [description]
         */
        this.getBrowserInfo = function(success, fail) {
          WeiboJSBridge.invoke("getBrowserInfo", {}, {
            success: function(params) {
                if(success) success(params);
            },
            fail: function(params, code) {
                // alert("fail_" + JSON.stringify(params) + "_" + code);
                if(fail) fail(params, code);
            },
            final: function(params) {
                // alert("final" + JSON.stringify(params));
            },
          });
        };
    };
    window.wb = new wb();
})(window);
